def solve(N, M, K, candy_boxes):
    # 最大的状态值是 2^M - 1，表示所有口味都品尝过
    ALL_FLAVORS = (1 << M) - 1
    
    # dp[mask]表示为了获得口味状态 mask 所需要的最小包数
    dp = [float('inf')] * (1 << M)
    dp[0] = 0  # 初始状态，什么口味都没有，包数为 0
    
    # 遍历每包糖果
    for box in candy_boxes:
        # 计算该包糖果提供的口味组合
        flavor_mask = 0
        for flavor in box:
            flavor_mask |= (1 << (flavor - 1))  # 使用 1 << (flavor - 1) 来标记该口味
        
        # 进行状态转移
        for mask in range((1 << M) - 1, -1, -1):  # 从大到小防止重复更新
            dp[mask | flavor_mask] = min(dp[mask | flavor_mask], dp[mask] + 1)
    
    # 如果 dp[ALL_FLAVORS] 是初始值，说明无法通过这些糖果包品尝到所有口味
    return dp[ALL_FLAVORS] if dp[ALL_FLAVORS] != float('inf') else -1

if __name__ == "__main__":
    N, M, K = map(int, input().split())
    candy_boxes = [list(map(int, input().split())) for _ in range(N)]
    
    print(solve(N, M, K, candy_boxes))
